package com.kgcx.common.exception;

import com.kgcx.common.bean.ReturnData;

/**
 * Created by panjin on 2017/11/27.
 */
public enum CoreErrors implements IErrors<ReturnData> {

    //0001-9999 为系统级错误码
    //10000-19999 coupon 优惠卷系统
    //20000-29999 flight 航班系统
    //30000-39999 opc 监管平台
    //40000-49999 order 订单系统
    //50000-59999 organization 用户系统
    //60000-69999 price 计费系统
    //70000-79999 schedule 派车系统
    //80000-89999 system 应用系统
    //......
    SUCCESS("0", "业务成功"),
    PROCESSING("0002", "业务处理中"),
    FAIL("9999", "业务失败"),
    PARAM_ILLEGAL("0003", "参数不符合规范"),
    PARAM_ILLEGAL_OTHER("0004", "参数不符合规范:%s"),
    INVALID_FORMAT("0005", "无效数据格式"),
    SYSTEM_ERROR("0006", "系统异常"),
    NETWORK_ERROR("0007", "网络异常"),
    UNKNOW_ERROR("0008", "服务暂不可用，请稍后重试"),
    IDEMPOTENCE_ERROR("0009", "幂等校验错误");

    private String code;

    private String message;

    private CoreErrors(String code, String message) {
        this.code = code;
        this.message = message;
    }

    /**
     * 采用枚举中定义的message作为返回信息
     *
     * @return
     */
    @Override
    public ReturnData parse() {
        return new ReturnData(code, message);
    }

    /**
     * 采用枚举中定义的message作为返回信息，并传递一些参数
     *
     * @param args 具体参数列表
     * @return
     */
    @Override
    public ReturnData parse(Object... args) {
        return null;
    }

    /**
     * 采用枚举中定义的code，使用自定义的message作为返回信息，并可能会带上一些参数
     *
     * @param message 错误信息
     * @param args    具体参数列表
     * @return
     */
    @Override
    public ReturnData parseMsg(String message, Object... args) {
        return null;
    }

    /**
     * 采用枚举中定义的message作为异常的信息
     *
     * @return
     */
    @Override
    public BaseException exp() {
        return new BaseException(code, message);
    }

    /**
     * 采用枚举中定义的message作为异常信息，并传递一些参数
     *
     * @param args 参数列表
     * @return
     */
    @Override
    public BaseException exp(Object... args) {
        String formatReason = String.format(message, args);
        return new BaseException(code, formatReason, args);
    }

    /**
     * 采用枚举中定义的message作为异常信息，并传递一些参数，支持传入底层的异常
     *
     * @param cause 原始异常
     * @param args  参数列表
     * @return
     */
    @Override
    public BaseException exp(Throwable cause, Object... args) {
        String formatReason = String.format(message, args);
        return new BaseException(code, formatReason, cause, args);
    }

    /**
     * 采用枚举中定义的code，使用自定义的message作为异常信息，并可能会带上一些参数
     *
     * @param message 错误信息
     * @param args    具体参数列表
     * @return
     */
    @Override
    public BaseException expMsg(String message, Object... args) {
        String formatReason = String.format(message, args);
        return new BaseException(formatReason, args);
    }

    /**
     * 采用枚举中定义的code，使用自定义的message作为异常信息，并可能会带上一些参数，并自持传入底层的异常
     *
     * @param message 错误信息
     * @param cause   原始异常
     * @param args    具体参数列表
     * @return
     */
    @Override
    public BaseException expMsg(String message, Throwable cause, Object... args) {
        String formatReason = String.format(message, args);
        return new BaseException(code, formatReason, cause, args);
    }

    public String getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}
